package org.singleton.junior;

import java.util.Arrays;

/**
 * 旋转数组
 * 给定一个数组，将数组中的元素向右移动 k 个位置，其中 k 是非负数。
 * 输入: nums = [1,2,3,4,5,6,7], k = 3
 * 输出: [5,6,7,1,2,3,4]
 * 解释:
 * 向右旋转 1 步: [7,1,2,3,4,5,6]
 * 向右旋转 2 步: [6,7,1,2,3,4,5]
 * 向右旋转 3 步: [5,6,7,1,2,3,4]
 * @author singleton-zw
 * @date 2021/11/5 20:35
 */
public class Rotate {
    public static void main(String[] args) {
        int[] nums = new int[]{-1,-100,3,99};
        int k = 2;
//
        int length = nums.length;
        int temp[] = new int[length];
        //把原数组值放到一个临时数组中，
        for (int i = 0; i < length; i++) {
            temp[i] = nums[i];
        }
        //然后在把临时数组的值重新放到原数组，并且往右移动k位
        for (int i = 0; i < length; i++) {
            System.out.print((i + k) % length+"   ");
            nums[(i + k) % length] = temp[i];
        }
//        System.out.println();
      // rte2(nums, k);


        // int[] numss = rte(nums);

        System.out.println(Arrays.toString(nums));
    }

    /**
     * k 大于数组的情况
     * @param nums
     * @param k
     */
    private static void rte2(int[] nums, int k) {
        //得到下标位
        int l = nums.length;
        int x = k%l;//7-3=4 也就是需要把下标4之后的数据旋转
        int[] xz = new int[l];
        //得到需要旋转的数组
        System.out.println(x);
        for (int i = x; i < nums.length; i++) {
            xz[i - (x+1)] = nums[i];
        }
        for (int m = 0; m < nums.length - k; m++) {
            xz[k + m] = nums[m];
        }
        for (int h = 0; h < xz.length; h++) {
            nums[h] = xz[h];
        }
    }

    /**
     * 数据大 超时
     * @return
     */
    private static int[] rte(int[] nums) {

        for (int k = 0; k < 5; k++) {
            int s = nums[nums.length-1];
            for (int i = nums.length-2; i >=0; i--) {
                nums[i+1] = nums[i];
            }
            nums[0] = s;
        }
        return nums;
    }
}
